﻿// Расширение monitor вложенным пространством имен gmap.    
monitor.gmap = monitor.gmap || {};
// Расширение monitor.gmap вложенным пространством имен event.  
monitor.gmap.event = monitor.gmap.event || {};

monitor.gmap.event.eventListener = function () {
    return {
        // Подписка на событие
        // 
        on: function(eventName, handler) {
            if (!this._eventHandlers) this._eventHandlers = [];
            if (!this._eventHandlers[eventName]) {
                this._eventHandlers[eventName] = [];
            }
            this._eventHandlers[eventName].push(handler);
        },
        // Прекращение подписки
        // 
        off: function(eventName, handler) {
            var handlers = this._eventHandlers[eventName];
            if (!handlers) return;
            if (handler == null) {
                handlers.length = 0;
            } else {
                for (var i = 0; i < handlers.length; i++) {
                    if (handlers[i] == handler) {
                        handlers.splice(i--, 1);
                    }
                }
            }
        },
        // Генерация события с передачей данных
        // Использование: this.trigger('click', item);
        //
        trigger: function(eventName) {

            if (!this._eventHandlers[eventName]) {
                return; // обработчиков для события нет
            }

            // вызвать обработчики 
            var handlers = this._eventHandlers[eventName];
            for (var i = 0; i < handlers.length; i++) {
                handlers[i].apply(this, [].slice.call(arguments, 1));
            }

        }
    };
};
